
import javax.microedition.lcdui.*;

public class Tabuleiro extends Canvas {

  public static final int PRETO = 0;
  public static final int BRANCO = 0xffffff;
  public static final int CINZA = 0xc6c6c6;
  public static final int CINZA_CLARO = 0xe5e3e3;
  public static final int VERMELHO = 0xff0000;
  public static final int CASA_ESCURA = 0xd18b47;
  public static final int CASA_CLARA = 0xffce9e;
  public static final int TAMANHO_GRID = 8;

  private Display tela;

  private Jogo jogo;

  private int tamanhoQuadrado;

  private int posicaoCursor;

  private int casaMarcada;

  Tabuleiro(Display d) throws Exception {

    tela = d;
    jogo = new Jogo();

    int largura = getWidth();
    int altura = getHeight();

    int tamanhoTela = altura;
    if(largura < altura) {
      tamanhoTela = largura;
    }
    tamanhoQuadrado = tamanhoTela / TAMANHO_GRID;

    posicaoCursor = 56;
    casaMarcada = 0;
  }

  void iniciar() {

    jogo.iniciar();
    tela.setCurrent(this);

  }

  protected void paint(Graphics g) {

    int largura = getWidth();
    int altura = getHeight();
    byte peca;

    g.setColor(BRANCO);
    g.fillRect(0, 0, largura, altura);

    for(int lin = 0; lin < 8; lin++) {
      for(int col = 0; col < 8; col++) {

        if((lin + col) % 2 != 0) {
          g.setColor(CASA_ESCURA);
        } else {
          g.setColor(CASA_CLARA);
        }

        g.fillRect(col * tamanhoQuadrado, lin * tamanhoQuadrado, tamanhoQuadrado, tamanhoQuadrado);

        peca = jogo.getPeca(lin, col);
        if (peca > 0) {
          desenhaPeca(g, lin, col, peca);
        }
      }
    }

    if(casaMarcada > 0) {
      desenhaCursor(g, VERMELHO, (casaMarcada - 1) / 8, (casaMarcada - 1) % 8);
    }

    if((casaMarcada - 1) != posicaoCursor) {
      desenhaCursor(g, jogo.vezBranco() ? BRANCO : PRETO, posicaoCursor / 8, posicaoCursor % 8);
    }

  }

  public void keyPressed(int keyCode) {
    int acao = getGameAction(keyCode);

    switch(acao) {
      case DOWN:
        posicaoCursor = (posicaoCursor + 8) % 64;
        break;
      case RIGHT:
        posicaoCursor = posicaoCursor / 8 * 8 + ((posicaoCursor + 1) % 8);
        break;
      case UP:
        posicaoCursor -= 8;
          if(posicaoCursor < 0) {
          posicaoCursor += 64;
        }
        break;
      case LEFT:
        posicaoCursor = posicaoCursor / 8 * 8 + ((posicaoCursor - 1) % 8);
        if(posicaoCursor < 0) {
          posicaoCursor = 7;
        }
        break;
      case FIRE:
/*
        int lin = posicaoCursor / 8;
        int col = posicaoCursor % 8;
        byte peca = jogo.getPeca(lin,col);
        if (casaMarcada == 0) {
          if (peca > 0) {
            casaMarcada = posicaoCursor + 1;
          }
        } else {
          if (peca == 0) {
            jogo.movePeca((casaMarcada - 1) / 8, (casaMarcada - 1) % 8, lin, col);
            casaMarcada = 0;
          }
        }
*/
        int lin = posicaoCursor / 8;
        int col = posicaoCursor % 8;
        if (casaMarcada == 0) {
          if (jogo.podeMarcar(lin,col)) {
            casaMarcada = posicaoCursor + 1;
          }
        } else {
          if (jogo.movePeca((casaMarcada - 1) / 8, (casaMarcada - 1) % 8, lin, col)) {
            casaMarcada = 0;
          }
        }
        break;
    }

    repaint();
    serviceRepaints();
  }

  public void desenhaCursor(Graphics g, int cor, int lin, int col) {

    g.setColor(cor);
    g.drawRect(col * tamanhoQuadrado, lin * tamanhoQuadrado, tamanhoQuadrado - 1, tamanhoQuadrado - 1);
    g.drawRect(col * tamanhoQuadrado + 1, lin * tamanhoQuadrado + 1, tamanhoQuadrado - 3, tamanhoQuadrado - 3);

  }

  public void desenhaPeca(Graphics g, int lin, int col, byte peca) {

//    byte peca = jogo.getPeca(lin, col);

//    if (peca > 0) {
      Image imagem = jogo.getImagem(peca);

      g.drawImage(imagem, col * tamanhoQuadrado + tamanhoQuadrado / 2,
        lin * tamanhoQuadrado + tamanhoQuadrado / 2, Graphics.VCENTER|Graphics.HCENTER);
//    }
  }

  public void resetaTabuleiro() {

    posicaoCursor = 56;
    casaMarcada = 0;
    jogo.resetaTabuleiro();
    repaint();
    serviceRepaints();

  }
}
